<?php

class DataSource extends Object {
/**
 *  判定是否连接数据库,值为false表示没连接上,true表示连接上了
 */
	public $connected = false;

/**
 * 用来判断是否开启数据库调试用的,true表示是开启,false表示关闭
 */
	public $fullDebug = false;

/**
  这个是通过$this->error = $this->lastError();这个得到的，是用来存储数据库最后操作的错误信息
 */
	public $error = null;

/**
这个是通过$this->affected = $this->lastAffected();这个来设置的,
取得最近一次与 connection 关联的 INSERT，UPDATE 或 DELETE 查询所影响的记录行数。
 */
	public $affected = null;

/**
 这个是通过$this->numRows = $this->lastNumRows();得到的
 返回结果集中行的数目。此命令仅对 SELECT 语句有效。
 */
	public $numRows = null;

/**
 * Time the last query took
 用来记录某条sql语句执行的时间
$t = microtime(true);
sql语句执行
$this->took = round((microtime(true) - $t) * 1000, 0);得到的
 */
	public $took = null;

/**
 * The starting character that this DataSource uses for quoted identifiers.
 *
 * @var string
 * @access public
 */
	public $startQuote = null;

/**
 * The ending character that this DataSource uses for quoted identifiers.
 *
 * @var string
 * @access public
 */
	public $endQuote = null;

/**
 * Result
这个是通过$this->_result = $this->_execute($sql);这个得到的一个结果集
 * @var array
 * @access protected
 */
	public $_result = null;

/**
记录执行sql语句的次数
 */
	public $_queriesCnt = 0;

/**
记录执行sql语句的总共是时间
 */
	public $_queriesTime = null;

/**
记录执行的每一条语句的日子数组
		$this->_queriesLog[] = array(
			'query' => $sql,
			'params' => $params,
			'affected' => $this->affected,
			'numRows' => $this->numRows,
			'took' => $this->took
		);
 */
	public $_queriesLog = array();

/**
指定最多存储日子的数量
 */
	public $_queriesLogMax = 200;

/**
用来存储执行了那些查询语句
 */
	public $_queryCache = array();

/**
默认的数据库配置信息
	public $_baseConfig = array(
		'persistent' => true,
		'host' => 'localhost',
		'login' => 'root',
		'password' => '',
		'database' => 'psp',
		'port' => '3306'
	);
 */
	public $_baseConfig = array();

/**
存储数据库表的结构
 */
	public $__descriptions = array();

/**
存储数据库中的所有表名,是一个数组
 */
	public $_sources = null;

/**
存储数据源的连接
 */
	public $connection = null;

/**
 *数据库的配置参数
 */
	public $config = array();

/**
这个是数据库配置文件中的
比如class DataBaseConfig {
	public $default = array(
		'datasource' => 'Mysql',
		'persistent' => false,
		'host' => 'localhost',
		'login' => 'root',
		'password' => '',
		'database' => 'newguifang',
		'prefix' => 'guifang_',
		'encoding' => 'utf8',
	);
}中的 default 
 */
	public $configKeyName = null;

/**
用来判断是否开启回滚这些东西的
 */
	public $_transactionStarted = false;

/**
用来设置是否开启数据库表名和表结构缓存，true表示开启，false表示关闭
 */
	public $cacheSources = true;


	public function __construct($config = array()) {
		parent::__construct();
		$this->setConfig($config);
	}

	public function setConfig($config = array()) {
		$this->config = array_merge($this->_baseConfig, $this->config, $config);
	}	
	
/**
得到某数据库的所有表名且将其缓存
 */
	public function listSources($data = null) {
		if ($this->cacheSources === false) {
			return null;
		}
		if ($this->_sources !== null) {
			return $this->_sources;
		}
		$key = ConnectionManager::getSourceName($this) . '_' . $this->config['database'] . '_list';
		$key = preg_replace('/[^A-Za-z0-9_\-.+]/', '_', $key);
		$sources = Cache::read($key, '_psp_model_');
		if (empty($sources)) {
			$sources = $data;
			Cache::write($key, $data, '_psp_model_');
		}
		$this->_sources = $sources;
		return $sources;
	}
/**
得到某数据库的表名且将其表面全部小写化
 */
	public function sources($reset = false) {
		if ($reset === true) {
			$this->_sources = null;
		}
		return array_map('strtolower', $this->listSources());
	}


/**
判断是否存在某个表的结构
 */
	public function describe(&$model) {
		if ($this->cacheSources === false) {
			return null;
		}
		$table = $model->tablePrefix . $model->table;

		if (isset($this->__descriptions[$table])) {
			return $this->__descriptions[$table];
		}
		$cache = $this->__cacheDescription($table);

		if ($cache !== null) {
			$this->__descriptions[$table] =& $cache;
			return $cache;
		}
		return null;
	}	
	
	
	
/**
将某个表结构进行写缓存或读取缓存
 */
	public function __cacheDescription($object, $data = null) {
		if ($this->cacheSources === false) {
			return null;
		}
		if ($data !== null) {
			$this->__descriptions[$object] =& $data;
		}
		$key = ConnectionManager::getSourceName($this) . '_' . $object;
		$cache = Cache::read($key, '_psp_model_');
		if (empty($cache)) {
			$cache = $data;
			Cache::write($key, $cache, '_psp_model_');
		}
		return $cache;
	}	

	public function _begin() {
		return !$this->_transactionStarted;
	}


	public function _commit() {
		return $this->_transactionStarted;
	}


	public function _rollback() {
		return $this->_transactionStarted;
	}


	public function column($real) {
		return false;
	}

/**
插入
 */
	public function create(&$model, $fields = null, $values = null) {
		return false;
	}

/**
查找
 */
	public function read(&$model, $queryData = array()) {
		return false;
	}

/**
修改
 */
	public function update(&$model, $fields = null, $values = null) {
		return false;
	}

/**
删除
 */    
	public function delete(&$model, $id = null) {
		if ($id == null) {
			$id = $model->id;
		}
	}
	
	public function _select($sql=null) {
		return true;
	}
	public function _insert($sql=null) {
		return true;
	}	
	public function _update($sql=null) {
		return true;
	}	
	public function _delete($sql=null) {
		return true;
	}	
	//字段生成
	public function _fields($sql=null) {
		return true;
	}
	
	public function _values($sql=null) {
		return true;
	}	
	public function _set($sql=null) {
		return true;
	}	
    //表名生成	
	public function _table($sql=null) {
		return true;
	}
	
	public function _alias($sql=null) {
		return true;
	}
	
	public function _from($sql=null) {
		return true;
	}	
	public function _joins($sql=null) {
		return true;
	}
	public function _on($sql=null) {
		return true;
	}	
	public function _group($sql=null) {
		return true;
	}
	public function _order($sql=null) {
		return true;
	}
	public function _limit($sql=null) {
		return true;
	}	
	
	//条件语句生成
	public function _where($sql=null) {
		return true;
	}
    //与符号生成	
	public function _and($sql=null) {
		return true;
	}
	public function _or($sql=null) {
		return true;
	}
	public function _in($sql=null) {
		return true;
	}
	public function _not($sql=null) {
		return true;
	}
	public function _is($sql=null) {
		return true;
	}	
	public function _forupdate($sql=null) {
		return true;
	}	
    //计算表达式的和	
	public function _sum($sql=null) {
		return true;
	}
	//计算表达式的平均值 	
	public function _avg($sql=null) {
		return true;
	}
    //对表达式进行简单的计数	
	public function _count($sql=null) {
		return true;
	}	
	//求最大值  
	public function _max($sql=null) {
		return true;
	}	
	//求最小值
	public function _min($sql=null) {
		return true;
	}	
	
	
/**
的到最后插入id号
 */
	public function lastInsertId($source = null) {
		return false;
	}

/*
返回结果集中行的数目。
此命令仅对 SELECT 语句有效。
*/
	public function lastNumRows($source = null) {
		return false;
	}

/*
函数返回前一次 MySQL 操作所影响的记录行数
取得最近一次与 connection 关联的 INSERT，UPDATE 或 DELETE 查询所影响的记录行数。
返回值
执行成功，则返回受影响的行的数目，如果最近一次查询失败的话，函数返回 -1。
*/
	public function lastAffected($source = null) {
		return false;
	}

/**
判断php是否加载了比如mysql,mssql等的操作函数，比如extension_loaded('mysql')
 */
	public function enabled() {
		return true;
	}
/**
判断本类是否存在该方法
 */
	public function isInterfaceSupported($interface) {
		static $methods = false;
		if ($methods === false) {
			$methods = array_map('strtolower', get_class_methods($this));
		}
		return in_array(strtolower($interface), $methods);
	}


	public function __destruct() {
		if ($this->_transactionStarted) {
			$null = null;
			$this->_rollback($null);
		}
		if ($this->connected) {
			$this->close();
		}
	}
}
?>